/*********************************************************************************************//**
* \file gsm.c
* \author Daneluzzi F., Pelloux-Prayer J., Battandier P.
* \version 1
* \date Février 2012
* \brief Bibliothèque contenant les fonctions utilisées pour la gestion du module GSM.
*************************************************************************************************/
#include "gsm.h"

void init_GSM(void)
{
    char message[5] = "ATE0\0";
    int iIndex = 4;
    EmissionUSART2(message, iIndex);
}

/************************ Emission commande AT GSM **********************/
void emettreCommandeAT(char *AT_Cmd, char Param_Size, char *AT_Param)
{
    char message[60] = "AT+\0";
    int iCpt = 0;
    int sizeOfMessage;

    strcat(message, AT_Cmd);
    sizeOfMessage = strlen(message);
    
    if (Param_Size == NO_PARAMETER)
    {    
        message[sizeOfMessage++] = '?';
    }
    else if (Param_Size != NO_PARAMETER_AND_NO_EQUAL)
    {
        message[sizeOfMessage++] = '=';
        message[sizeOfMessage] = 0;
        strcat(message, AT_Param);
        sizeOfMessage = strlen(message);
    }
    message[sizeOfMessage++] = '\r';
    message[sizeOfMessage] = 0;

    // sizeOfMessage vaut le nombre de caractère (il commence a zero)
    EmissionUSART2(message, sizeOfMessage);
 }

/********************** Envoi d'SMS **********************/
void sendSMS(char *dest, char *data, int sizeData)
{
    char AT_SMS[5] = "CMGS\0";                 // commande AT pour écrire un message
    char buffer[60+2];

    emettreCommandeAT(AT_SMS, 12, dest);    // émission de la commande AT_SMS

    strcpy(buffer, data);

    buffer[sizeData++] = VALIDATION_CMD_SMS;
    buffer[sizeData] = 0;

    EmissionUSART2(buffer, sizeData);
}

/*********************** Affichage de la date via le module GSM ************************/
void getTime(char *date_gsm)
{
    char Reponse_Date[SIZE_AT_DATE];
    char AT_DATE[5] = "CCLK\0";

    emettreCommandeAT(AT_DATE, NO_PARAMETER, NULL);                 // émission de la commande AT_DATE
    ReceptionUSART2(Reponse_Date, TIMEOUT_GSM_RC);    // réception  de la chaine date du gsm
    strncpy (date_gsm, Reponse_Date + 8, SIZE_CCLK_PARAM);          // suppression de l'affichage de la commande AT
}

/**************************** Récupération du signal GSM ****************************/
int get_GSM_RESEAU()
{
    // Valeur de l'offset de la commande CSQ = 5
    // Type de réponse : +CSQ: xx,xx
    char msg_RSSI[12];
    char AT_Reseau[] = "CSQ";
    int i;

    emettreCommandeAT(AT_Reseau, NO_PARAMETER_AND_NO_EQUAL, NULL);    // émission de la commande AT_Reseau
    ReceptionUSART2(msg_RSSI, TIMEOUT_GSM_RC);                              // réception du niveau RSSI

    i = OFFSET_CSQ;                 // On enlève la partie fixe contenant la commande
    while (msg_RSSI[i++] != ',');   // On recherche le séparateur (la virgule)
    msg_RSSI[i] = 0;                // Et on remplace la virgule par le caractère de fin de chaîne

    return atoi(msg_RSSI + OFFSET_CSQ); // La commande transforme la chaine de caractère en entier jusqu'au premier caractère NULL
}

/****************** Régler l'heure *******************/
void setTime(char *strDate)
{
    char AT_CCLK[5]="CCLK\0";                                 //commande heure du modem
    emettreCommandeAT(AT_CCLK, SIZE_CCLK_PARAM, strDate);
}

/***************** Commande pour effacer tout les SMS *******************/
void removeAllSMS(void)
{
    char parametreCMGD[4] = "1,4\0";
    char AT_CGMD[5] = "CMGD\0";

    emettreCommandeAT(AT_CGMD, SIZE_CMGD_PARAM, parametreCMGD);
}
